/**
 * @description:
 * @file: methods.ts
 * @author: Evan
 * @date: 2025.08.26 11:42:31
 * @week: 周二
 * @version: V
 */

import type { echarts } from '@/echarts'
import AMapLoader from '@amap/amap-jsapi-loader'

/**
 * 加载 高德地图
 */
export const loadAMap = () => {
  // @ts-ignore
  window._AMapSecurityConfig = {
    securityJsCode: '5fdc60917a1ec039a6e4dde062d51699'
  }

  return AMapLoader.load({
    key: 'e33522215c925af74ad5211f78881154', // 申请好的Web端开发者Key，首次调用 load 时必填
    version: '2.0', // 指定要加载的 JSAPI 的版本，缺省时默认为 1.4.15
    plugins: [
      'AMap.Scale', // 比例尺，显示当前地图中心的比例尺
      'AMap.ToolBar', // 工具条，控制地图的缩放、平移等
      // 'AMap.PolygonEditor', // 多边形编辑插件，用于通过鼠标调整多边形形状
      'AMap.Weather', // 天气预报插件，用于获取未来的天气信息
      'AMap.Geolocation', // 浏览器定位，提供了获取用户当前准确位置、所在城市的方法
      'AMap.DistrictSearch' // 行政区查询服务，提供了根据名称关键字、citycode、adcode 来查询行政区信息的功能
    ], //需要使用的的插件列表，如比例尺'AMap.Scale'，支持添加多个如：['...','...']
    AMapUI: {
      version: '1.1',
      plugins: ['overlay/SimpleMarker', 'geo/DistrictExplorer']
    }
  })
}

/**
 * 获取编码地区数据
 */
export const loadAreacodeData = (
  map: AnyObject,
  areaCode: number | string
): Promise<Parameters<typeof echarts.registerMap>[1]> => {
  // @ts-ignore
  const AMapUI = window.AMapUI
  if (!AMapUI) return Promise.reject()
  //创建一个实例
  var districtExplorer = new AMapUI.DistrictExplorer({
    eventSupport: true, //打开事件支持
    map: map
  })

  return new Promise((resolve, reject) => {
    districtExplorer.loadAreaNode(areaCode, (error: AnyObject, areaNode: AnyObject) => {
      if (error) {
        reject(error)
        return
      }
      const mapJson: Parameters<typeof echarts.registerMap>[1] = {
        type: 'FeatureCollection',
        features: areaNode.getSubFeatures()
      }
      resolve(mapJson)
    })
  })
}

/**
 * 保存文件
 */
// 文件保存
import { blobType } from './blob-types'
import { getFormatDate } from '@/utils/date'

export const fileSave = (type: keyof typeof blobType, res: any, fielName?: string) => {
  let blob = new Blob([res], { type: blobType[type] })
  let a = document.createElement('a')
  let href = window.URL.createObjectURL(blob)
  a.href = href
  a.target = '_blank'
  // 判断结尾是否为文件后缀 否则添加
  let name = fielName || getFormatDate(0, 'yyyy-MM-dd-hh_mm_ss')
  if (!name.endsWith(type)) {
    name += '.' + type
  }
  a.download = name
  document.body.appendChild(a)
  a.click()
  a.remove()
}

import JSZip from 'jszip'
/**
 * 下载列表 geojson
 */
export const downloadListGeoJson = (
  list: ListItem[],
  map: AnyObject,
  callback: (text: string) => void
) => {
  // @ts-ignore
  const AMapUI = window.AMapUI
  if (!AMapUI) return Promise.reject()
  //创建一个实例
  var districtExplorer = new AMapUI.DistrictExplorer({
    eventSupport: true, //打开事件支持
    map: map
  })

  const zip = new JSZip()
  let mapJson: AnyObject = {}
  const tasks = list.map(
    item =>
      new Promise(resolve => {
        districtExplorer.loadAreaNode(item.code, (error: AnyObject, areaNode: AnyObject) => {
          if (error) {
            callback(`${item.name}--${item.code}，数据获取失败`)
            return resolve(1)
          }
          mapJson.type = 'FeatureCollection'
          mapJson.features = (areaNode && areaNode.getSubFeatures()) || ''

          callback(`${item.type}--${item.name}--${item.code}，数据获取成功，正在打包`)
          if (String(item.type) === 'province') {
            zip.file(`100000/${item.code}.geoJson`, JSON.stringify(mapJson))
          } else {
            zip.file(
              `100000/${String(item.code).substring(0, 2)}0000/${item.code}.geoJson`,
              JSON.stringify(mapJson)
            )
          }
          return resolve(1)
        })
      })
  )
  callback('总文件个数：' + tasks.length)
  let count = 1
  tasks.forEach(async task => {
    await task
    count++
    if (count === tasks.length) {
      // let readme = `\r\n项目源码github地址：https://github.com/TangSY/echarts-map-demo （欢迎star）\r\n个人空间：https://www.hxkj.vip （欢迎闲逛）\r\nEmail：t@tsy6.com  （遇到问题可以反馈）`
      // zip.file(`readMe(sourceCode).txt`, readme)

      zip.generateAsync({ type: 'blob' }).then(content => {
        fileSave('zip', content, 'geoJson数据包.zip')
      })
    }
  })
}

/**
 * 地图配置
 */
export const getEcOPts = (mapName: string, data: any[]): ZEchartsOptions => {
  return {
    visualMap: {
      type: 'piecewise',
      pieces: [
        { max: 30, label: '安全', color: '#2c9a42' },
        { min: 30, max: 60, label: '警告', color: '#d08a00' },
        { min: 60, label: '危险', color: '#c23c33' }
      ]
    },
    series: [
      {
        name: '数据名称',
        type: 'map',
        roam: false,
        map: mapName,
        data: data,
        label: {
          show: true,
          color: '#fff'
        }
      }
    ]
  }
}
